import request from "@/utils/request";
import * as MusicType from "./type";
import { requestHandler } from "../requestHandler";

/**
 * 传入类型参数约束
 */
interface MusicRequest {
  id: number;
  level?: string;
  type?: number;
}
/**
 * 获取数据类型约束
 */
interface MusicDetail {
  id: number;
  name: string;
  url: string;
  picUrl: string;
  lrc: object;
  isLike: boolean;
  isCollect: boolean;
  commentCount: number;
  likedCount: number;
  collectCount: number;
  countDesc: string;
}
/**
 *  返回类型约束
 */
export interface MusicInfo {
  code: number;
  data?: any;
  ids: Array<number>;
  lrc?: {
    lyric?: string;
  };
  songs?: Array<any>;
}

// 音乐相关api
const apiPath = {
  urlV1: "/song/url/v1", // 获取音乐 url
  comment: "/comment/music", // 评论
  lyric: "/lyric", // 歌词
  lyricNew: "/lyric/new", //歌词新版
  sendOrDeleteComment: "/comment", // 发送或删除评论
  detail: "/song/detail", // 歌曲详情
  getSongListAllSong: "/playlist/track/all", // 获取歌单全部歌曲
  record: "/user/record", // 听歌记录
  countDecs: "/song/red/count", // 歌曲红心数量
  likeList: "/likelist", // 喜欢列表
  likes: "/like", // 喜欢
  recommend: "/recommend/songs", // 推荐歌曲
};

/**
 * 获取音乐 url - 新版
 * @description 说明 : 使用歌单详情接口后 , 能得到的音乐的 id, 但不能得到的音乐 url, 调用此接口, 传入的音乐 id( 可多个 , 用逗号隔开 ),
 *  可以获取对应的音乐的 url,未登录状态或者非会员返回试听片段(返回字段包含被截取的正常歌曲的开始时间和结束时间),注 : 部分用户反馈获取的 url
 *  会 403,hwaphon找到的解决方案是当获取到音乐的 id 后，将 https://music.163.com/song/media/outer/url?id=id.mp3 以 src 赋予 Audio 即可播放
 * @param {Number | String} params.id 音乐 id
 * @param {Boolean} params.level  播放音质等级, 分为 standard => 标准,higher => 较高, exhigh=>极高, lossless=>无损, hires=>Hi-Res,
 * jyeffect => 高清环绕声, sky => 沉浸环绕声, jymaster => 超清母带
 */
// export function getMusicURLByIds(params: MusicType.MusicURLByIdsParam) {
//     return request({
//         url: apiPath.urlV1,
//         method: "get",
//         params
//     });
// }
export const getMusicURLByIds = requestHandler<MusicRequest, MusicInfo>(
  (params) => {
    return request({
      url: apiPath.urlV1,
      method: "get",
      params,
    });
  }
);

interface LyricRequest {
  id: number | string;
}
/**
 * 获取歌词
 * @description 说明 : 调用此接口 , 传入音乐 id 可获得对应音乐的歌词 ( 不需要登录 )
 * @param {Number | String} params.id 歌曲id
 */
export const getSongLyric = requestHandler<LyricRequest, MusicInfo>(
  (params) => {
    return request({
      url: apiPath.lyric,
      method: "get",
      params,
    });
  }
);
export function getSongLyricNew(params: MusicType.MusicCommentParam) {
  return request({
    url: apiPath.lyricNew,
    method: "get",
    params,
  });
}

/**
 * @说明: 调用此接口获取歌曲的红心用户数量
 * @必选参数：id: 歌曲id
 */
export const getCountDecs = requestHandler<{ id: number }, MusicInfo>(
  (params) => {
    return request({
      url: apiPath.countDecs,
      method: "get",
      params,
    });
  }
);

/**
 * @说明 : 调用此接口 , 传入用户 id, 可获取已喜欢音乐 id 列表(id 数组)
 * @必选参数 : uid: 用户 id
 * @接口地址 : /likelist
 */
export const getMusicLikeList = requestHandler<{ uid: number }, MusicInfo>(
  (params) => {
    return request({
      url: apiPath.likeList,
      method: "get",
      params,
    });
  }
);

/**
 * @说明 : 调用此接口 , 传入音乐 id, 可喜欢该音乐
 * @必选参数 : id: 歌曲 id
 * @可选参数 : like: 布尔值 , 默认为 true 即喜欢 , 若传 false, 则取消喜欢
 * @接口地址 : /like
 */
export const getMusicLike = requestHandler<
  { id: number; like: Boolean },
  MusicInfo
>((params) => {
  return request({
    url: apiPath.likes,
    method: "get",
    params,
  });
});

export const getMusicDetail = requestHandler<
  { ids: number | string },
  MusicInfo
>((params) => {
  return request({
    url: apiPath.detail,
    method: "get",
    params,
  });
});

/**
 * 获取每日推荐歌曲
 * @说明 : 调用此接口 , 可获得每日推荐歌曲 ( 需要登录 )
 * @接口地址 : /recommend/songs
 * @returns
 */
export const getRecommendMusic = requestHandler(() => {
  return request({
    url: apiPath.recommend,
    method: "get",
  });
});
